package com.iflytek.sbd.demo.jihe.collection.list;

import java.util.ArrayList;

/**
 * @program: sbd
 * @description:
 * @author: 陈英俊
 * @create: 2022-01-11 16:25
 */
public class ArrayListDemo {


    public static void main(String[] args) {


        /**
         * <p>
         * 无参构造初始化的时候,直接实例化了一个空数组,会在第一次add的时候,进行判断,发生扩容,容量到达默认的10;
         * </p>
         * <p>
         * 构造方法三种:
         * 无参
         *　有参数，直接构建参数长度的底层数组
         *　直接使用集合作为参数
         * </p>
         *
         * grow()执行扩容,但是是否执行grow是根据 添加了当前元素之后集合的size是否比底层数组的length大,大不就是爆掉了,所以需要扩容,如果小,就不需要扩容,
         * 当我们使用无参构造初始化arraylist的时候,我们给elementData分配的是类定义的一个默认空数组,此时集合底层的数组elementData的地址是和默认空数组的地址是一样的
         * 然后我们add的时候,会发现一个判断,if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)  这不就是表示当前集合如果是一个空集合,就是此时是第一次add的话,
         * 我们就会把 添加当前元素之后集合的长度的1 修改为默认的10,此时这个10 只是我想要把底层数据长度变为多少的值, 具体的扩容,就是去根据这个值去扩容,
         * 这表示我想在第一次add的时候,把底层数据的length扩容到10,然后下面就是去调用真实的grow扩容方法,把底层数据的长度改为10,
         * 这样我第二次add的时候,底层传递的参数是当前集合长度加上当前add元素的长度,不就是2么, 此时经过第一次扩容,elementData地址也变了,经过判断,也不会把长度变为10,
         * 然后经过第二次判断的时候,2小于当前elementData的10.不会发生扩容
         */
        ArrayList<Integer> list = new ArrayList<>();
        list.add(null);
        list.add(null);
        System.out.println(list.size());// 2 支持存入多个null


        /**
        * 数组的删除:
        * 第一种:
        * 数组.remove(Index): 基于索引进行删除,从数组直接得到索引位的数据,然后重新复制数组
        * 第二种:
        * 数组.remove(Object o):基于对象进行删除,遍历数组每个位置数据,然后循环里面当前遍历的数据.equals(需要删除的数据),进行操作,
        * 删除也是进行数据的复制
        */
        ArrayList<String> list1 = new ArrayList<>();
        for (int i = 1; i <= 1000; i++) {
            list1.add(i + "wo");
        }
        //list1.remove(500);
        list1.remove("500wo");
    }
}
